package com.ilearn.iodata.iolingo.service.metadata.core.edm.mapper.api;

import java.util.Set;

/**
 * Created by lyndon on 2018/5/29.
 */
public interface From<Z, X> extends Path<X>, FetchParent<Z, X> {
    Set<Join<X, ?>> getJoins();

    boolean isCorrelated();

    From<Z, X> getCorrelationParent();

    <Y> Join<X, Y> join(SingularAttribute<? super X, Y> var1);

    <Y> Join<X, Y> join(SingularAttribute<? super X, Y> var1, JoinType var2);

    <Y> CollectionJoin<X, Y> join(CollectionAttribute<? super X, Y> var1);

    <Y> SetJoin<X, Y> join(SetAttribute<? super X, Y> var1);

    <Y> ListJoin<X, Y> join(ListAttribute<? super X, Y> var1);

    <K, V> MapJoin<X, K, V> join(MapAttribute<? super X, K, V> var1);

    <Y> CollectionJoin<X, Y> join(CollectionAttribute<? super X, Y> var1, JoinType var2);

    <Y> SetJoin<X, Y> join(SetAttribute<? super X, Y> var1, JoinType var2);

    <Y> ListJoin<X, Y> join(ListAttribute<? super X, Y> var1, JoinType var2);

    <K, V> MapJoin<X, K, V> join(MapAttribute<? super X, K, V> var1, JoinType var2);

    <X, Y> Join<X, Y> join(String var1);

    <X, Y> CollectionJoin<X, Y> joinCollection(String var1);

    <X, Y> SetJoin<X, Y> joinSet(String var1);

    <X, Y> ListJoin<X, Y> joinList(String var1);

    <X, K, V> MapJoin<X, K, V> joinMap(String var1);

    <X, Y> Join<X, Y> join(String var1, JoinType var2);

    <X, Y> CollectionJoin<X, Y> joinCollection(String var1, JoinType var2);

    <X, Y> SetJoin<X, Y> joinSet(String var1, JoinType var2);

    <X, Y> ListJoin<X, Y> joinList(String var1, JoinType var2);

    <X, K, V> MapJoin<X, K, V> joinMap(String var1, JoinType var2);
}
